class RestLiqController < ApplicationController
  skip_before_filter :check_request_exception
  protect_from_forgery :only => [:update, :delete]

  def solicitar_apoyo
    # MANDA UNA PETICION A OTRO EQUIPOOO EN XML CON REST VIA POST
    # serviciosliq@gmail.com       clave= liq12345
    
    @orden = Orden.first(:conditions => [" id = ? ", params[:id]])
    @paquete = Paquete.first(:conditions => [" orden_id = ? ", @orden.id ])
      
    informacion= "
        <solicitud>
            <client>serviciosliq@gmail.com</client>
            <address>Principal</address>
            <creditcard>123456789012345</creditcard>
            <serviceorder>
                <Sernomentregado>"+@orden.nombre.to_s+"</Sernomentregado>
                <Sercalle>"+@orden.avenida.to_s+"</Sercalle>
                <Sercasa>"+@orden.residencia.to_s+"</Sercasa>
                <Sernumerocasa>"+@orden.numero.to_s+"</Sernumerocasa>
                <Serurb>"+@orden.urbanizacion.to_s+"</Serurb>
                <Serciudad>"+@orden.ciudad.to_s+"</Serciudad>
                <Serpais>"+@orden.pais.to_s+"</Serpais>
                <Sercodpostal>"+@orden.codigo.to_s+"</Sercodpostal>
            </serviceorder>
            <package>
              <Pacpeso>"+@paquete.peso.to_s+"</Pacpeso>
              <Pacdescripcion>"+@paquete.descripcion.to_s+"</Pacdescripcion>
            </package>
        </solicitud>"

   
    
    uri = URI.parse("http://192.168.22.35:3000/rest/solicitud")
    http = Net::HTTP.new(uri.host, uri.port)
    headers = { 'Content-Type'=>'application/xml', 'Content-Length'=>informacion.size.to_s }
    post = Net::HTTP::Post.new(uri.path, headers)
    response = http.request post, informacion

    respuestaxml = Hash.from_xml(response.body)
    case response
    when Net::HTTPCreated
      if respuestaxml["serviceorder"]
      @orden.tipo = respuestaxml["serviceorder"]["serviceorder_id"]
        
      if respuestaxml["serviceorder"]["total"] > @orden.total.to_s
        @orden.recargo= respuestaxml["serviceorder"]["total"]
        diferencia = @orden.recargo - @orden.total
        @orden.recargo= diferencia
        @orden.statusRecargo = "1"
      end
      @orden.status = 'Recoleccion Externa'
      @orden.save
         
      flash[:notice] = 'La notificacion ha sido recibida satisfactoriamente con el tracking:'+respuestaxml["serviceorder"]["serviceorder_id"]+' y un costo de '+respuestaxml["serviceorder"]["total"]+'   '
      else
          flash[:notice] = 'Ha ocurrido el siguiente error:'+respuestaxml["error"]+''
      end

      when Net::HTTPSuccess
      if respuestaxml["serviceorder"]
      @orden.tipo = respuestaxml["serviceorder"]["serviceorder_id"]

      if respuestaxml["serviceorder"]["total"] > @orden.total.to_s
        @orden.recargo= respuestaxml["serviceorder"]["total"]
        diferencia = @orden.recargo - @orden.total
        @orden.recargo= diferencia
        @orden.statusRecargo = "1"
      end
      @orden.status = 'Recoleccion Externa'
      @orden.save
        
      flash[:notice] = 'La notificacion ha sido recibida satisfactoriamente con el tracking:'+respuestaxml["serviceorder"]["serviceorder_id"]+' y un costo de '+respuestaxml["serviceorder"]["total"]+'   '
      else
          flash[:notice] = 'Ha ocurrido el siguiente error:'+respuestaxml["error"]+''
      end
    else response.error!
        flash[:notice] = 'No ha habido una respuesta por parte del servicio'
    end
    redirect_to :controller => 'ordens', :action => 'orden_entregar'
    
  end


  #METODO QUE RECIBE UNA PETICION DE APOYO DE RECOLECCION POR XML VIA REST

  def recepcion_apoyo  
      if leer = request_exception
        error_leer = leer.name.to_s
      if error_leer == "REXML::ParseException"
            @respuesta= "<error>Hay algun error en las etiquetas</error>"

      else
        if xml = params[:recepcion_apoyo]
          error= nil
          
        if xml["cliente"] and xml["cliente"]["correo"]
          @cliente = Cliente.new(xml["cliente"])
          cli = Cliente.find(:first, :conditions => [" correo = ?", @cliente.correo ])
          if cli
            @cliente.id= cli.id
          else
            error="El cliente no esta registrado"
          end
        else
          error="No se puede leer la etiqueta cliente"
        end
        
        if xml["pago"] and error == nil and xml["pago"]["numero"]
            @pago = Pago.new(xml["pago"])
            tarjeta = Pago.find(:first, :conditions => [" numero = ?", @pago.numero ])
        if tarjeta
          @pago.cliente_id= cli.id
        else
          error="La tarjeta no esta registrada"
        end
        else
          if !error
            error="No se puede leer la etiqueta pago"
          end
        end

        
         if xml["direccion"] and xml["direccion"]["nombre"] and error == nil
            @direccion = Direccion.new(xml["direccion"])
            direc = Direccion.find(:first, :conditions => [' nombre=? and cliente_id=? ', @direccion.nombre, cli.id ])
        if direc
          @direccion.cliente_id= cli.id
        else
          error="La direccion no esta registrada"
        end
        else
          if !error
            error="No se puede leer la etiqueta direccion"
          end
        end
       
          if  xml["orden"] and error == nil and xml["paquete"] and xml["orden"]["nombre"] and xml["orden"]["apellido"] and xml["orden"]["avenida"] and xml["orden"]["residencia"] and xml["orden"]["numero"] and xml["orden"]["urbanizacion"] and xml["orden"]["ciudad"] and xml["orden"]["pais"] and xml["orden"]["codigo"] and xml["orden"]["latitud"] and xml["orden"]["longitud"]
              @orden = Orden.new(xml["orden"])
              @orden.cliente_id = cli.id
              @orden.direccion_id = direc.id
              @orden.pago_id = tarjeta.id
              @orden.status = 'Pendiente por Recoleccion'
              @orden.fechaOrden= Time.new.strftime("%m/%d/%Y")

            if xml["paquete"]["peso"] and xml["paquete"]["descripcion"]
                if @orden.save
                      @paquete = Paquete.new(xml["paquete"])
                      @paquete.orden_id = @orden.id
                      @paquete.costo = @paquete.peso * 3

                    if @paquete.save
                        @orden.tracking=@orden.id
                        iva= @paquete.costo*0.12
                        @orden.total = @paquete.costo + iva
                        @orden.save
                        etapa= Etapa.new
                        etapa.descripcion='Pendiente por Recoleccion'
                        etapa.fecha= Time.new.strftime("%m/%d/%Y %H:%M:%S")
                        etapa.orden_id=@orden.id
                        etapa.save
                    else
                       error="No pudo ser procesada la orden revise los valores dentro de paquetes"
                    end


                            @respuesta=
                              '<respuesta_apoyo>
                                  <tracking>'+@orden.tracking.to_s+'</tracking>
                                  <total>'+@orden.total.to_s+'</total>
                          </respuesta_apoyo>'
                else
                      error="No pudo ser procesada la orden revise los valores dentro de la etiqueta orden"
                end
            else
                error="No pudo ser procesada la orden revise la informacion dentro de la etiqueta orden"
            end

        else
          if !error
            error="No se puede leer la etiqueta orden"    
          end
        end

          else
            error="No se puede leer la etiqueta recepcion_apoyo"
            
          end
      end
    end
    if error
      @respuesta= "<error>"+error+"</error>"
    end
      puts error
    respond_to do |format|
      format.xml {render :status => :created}
    end
  end



  def servicio_etapa
    @orden = Orden.first(:conditions => [" tracking = ? ", params[:id] ])
    @etapas = Etapa.all(:conditions =>["orden_id = ?", @orden.id ])
          
    respond_to do |format|
      format.xml {render :status => :created}
    end
  end
  
#Metodo que se encarga de consultar las diferentes etapas en la otra empresa
   def solicitar_etapa
     @color
     @contcolor=0
     @orden = Orden.first(:conditions => ["tracking = ? ", params[:id]])
     
        begin
          xml_result_set = Net::HTTP.get_response(URI.parse("http://192.168.22.35:3000/rest/tracking/"+@orden.tipo.to_s+""))
        rescue Exception => e
          puts 'Connection error: ' + e.message
        end

    @respuesta = xml_result_set.body
    respuestaxml = Hash.from_xml(@respuesta)
    @fecha = respuestaxml["historial"]["movimiento"]["fecha"]
    @descripcion= respuestaxml["historial"]["movimiento"]["descripcion"]
    @etapas = Etapa.all(:conditions =>["orden_id = ?", @orden.id])
 
   
   end
         
end
